home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / prog / cfuncs.zip / CONVDATE.C < prev    next >
C/C++ Source or Header  |  1991-12-23  |  6KB  |  211 lines

  1. #include <dos.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <funcs.h>
  5.  
  6. unsigned int DateToVal(struct date date1)
  7. {
  8.    unsigned int yrdays, modays;
  9.    int mo, dy, yr;
  10.    int md[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
  11.  
  12.    mo = date1.da_mon;
  13.    dy = date1.da_day;
  14.    yr = date1.da_year - 1900;
  15.  
  16.    if(yr == 0 && mo == 0 && dy == 0)   return(0);
  17.  
  18. /*   yrdays = (yr - 1) * 365.25; */
  19.    yrdays = ((yr - 1) * 36525l)/100;
  20.    --mo;
  21.    modays = (mo>=0 && mo<=11) ? md[mo] : 0;
  22.  
  23.    if(mo > 1 && (yr % 4) == 0) ++modays;  /* leap year */
  24.  
  25.    return(yrdays + modays + dy);
  26. } /* Date to value */
  27.  
  28. void ValToDate(unsigned int Value, struct date *the_date)
  29. {
  30.     int  lb[] = {1, 32, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335};
  31.     int yr, mo, days, leapday, year;
  32.  
  33.     if(Value == 0) {
  34.       the_date->da_day = 0;
  35.       the_date->da_mon = 0;
  36.       the_date->da_year = 0;
  37.       return;  }
  38.  
  39.     /* floating point stuff doesn't always work in Turbo C so don't
  40.        use it unless you have to. */
  41.  
  42.     year =  Value * 100l / 36525l;
  43.  
  44.     if(year *100l == Value*10000l / 36525l) {
  45.        the_date->da_day = 31;
  46.        the_date->da_mon = 12;
  47.        the_date->da_year = year+1900;
  48.        return;  }
  49.  
  50.     days = Value - year * 36525l / 100;
  51.     yr = year;
  52.     ++yr;
  53.  
  54.     leapday = (yr % 4 == 0 && days == 60);
  55.  
  56.     if(yr % 4 == 0 && days >= 60) --days;
  57.  
  58.     if(days <1 || days > 365) {
  59.        the_date->da_day = 0;
  60.        the_date->da_mon = 0;
  61.        the_date->da_year = 0;
  62.        return;  }
  63.  
  64.     for(mo=0; mo<12; ++mo)
  65.     {
  66.       if(days < lb[mo])
  67.         break;
  68.     }
  69.  
  70.     days -= lb[mo-1] - 1;
  71.     if(leapday) days = 29;
  72.  
  73.     the_date->da_day = days;
  74.     the_date->da_mon = mo;
  75.     the_date->da_year = yr+1900;
  76.     return;
  77. } /* value to date */
  78.  
  79. validdate(int dd, int mm, int yy)
  80. {
  81.     if (dd < 1 || dd > 31)
  82.         return(0);
  83.     if (mm < 1 || mm > 12)
  84.         return(0);
  85.     if ((mm == 4 || mm == 6 || mm == 0 || mm == 11) && dd > 30)
  86.         return(0);
  87. /*    if (yy <= 80)
  88.         return(0); */
  89.     if (mm == 2 && dd > 29)
  90.         return(0);
  91.     if ((yy % 4 != 0) && dd > 28 && mm==2)
  92.         return(0);
  93.  
  94.     return(1);
  95. }
  96.  
  97. /*---------------------ConvertDate------------------------------*/
  98. /*DESCRIPTION:    Converts a date in src_format to a date in      */
  99. /*    dest_format.  May take the system date as input.    */
  100. /*                                */
  101. /*INPUT:                             */
  102. /*  src_format =                                                */
  103. /*  0 -- Julian date (unsigned int)                             */
  104. /*  1 -- System date                                            */
  105. /*  3 -- MMDDYY                                                 */
  106. /*  4 -- YYMMDD                            */
  107. /*  5 -- MM-DD-YY                                               */
  108. /*  6 -- MM/DD/YY                                               */
  109. /*  7 -- M-D-YYYY                                               */
  110. /*  8 -- M/D/YYYY                                               */
  111. /*                                                              */
  112. /*  dest_format =  same as src_format except            */
  113. /*  1 -- Month D, YYYY                        */
  114. /*  2 -- Weekday, Month D, YYYY                    */
  115. /*  9 -- 0-6 (char) for day of week with 0 -> Sunday         */
  116. /*                                                              */
  117. /*RETURNS: 0 for a valid date                    */
  118. /*       -1 for an invalid date or format            */
  119. /*USES: MidStr, ValToDate, DateToVal, validdate         */
  120. /*--------------------------------------------------------------*/
  121.  
  122. int ConvertDate(void *dest_date, void *src_date, int dest_format, int src_format)
  123. {
  124.      char tmp[15], *ptr;
  125.      char *month[] = { "illegal", "January", "February", "March",
  126.             "April", "May", "June", "July", "August",
  127.             "September", "October", "November", "December"};
  128.      char *day[] = { "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday",
  129.             "Friday", "Saturday"};
  130.  
  131.      struct date dte;
  132.  
  133.      switch (src_format)
  134.      {
  135.        case 0: ValToDate( *((unsigned int *) src_date), &dte); break;
  136.        case 1: getdate(&dte); break;
  137.        case 3: dte.da_day = atoi(MidStr(tmp, ((char *) src_date)+2, 2));
  138.            dte.da_mon = atoi(MidStr(tmp, (char *) src_date, 2));
  139.            dte.da_year = atoi(((char *) src_date)+4)+1900;
  140.            break;
  141.        case 4: dte.da_day = atoi(((char *) src_date)+4);
  142.            dte.da_mon = atoi(MidStr(tmp, ((char *) src_date)+2, 2));
  143.            dte.da_year = atoi(MidStr(tmp, (char *) src_date, 2))+1900;
  144.            break;
  145.        case 5: case 6: case 7: case 8:
  146.            if(strlen((char *)src_date) > 14)
  147.            MidStr(tmp, (char *)src_date, 14);
  148.            else
  149.            strcpy(tmp, (char *)src_date);
  150.            ptr = strtok(tmp, "-/ ");  dte.da_mon = atoi(ptr);
  151.            ptr = strtok(NULL, "-/ "); dte.da_day = atoi(ptr);
  152.            ptr = strtok(NULL, "-/ "); dte.da_year = atoi(ptr);
  153.            if(src_format==5 || src_format==6)
  154.           dte.da_year += 1900;
  155.            break;
  156.        default: return(-1);
  157.      }
  158.  
  159.      if(!validdate((int)dte.da_day, (int)dte.da_mon, dte.da_year-1900))
  160.        return(-1);
  161.  
  162.      switch (dest_format)
  163.      {
  164.     case 0: *((unsigned int *) dest_date) = DateToVal(dte); break;
  165.     case 1 : sprintf((char *) dest_date, "%s %1d, %d",
  166.         month[dte.da_mon], dte.da_day,
  167.         dte.da_year); break;
  168.     case 2 : sprintf((char *) dest_date, "%s, %s %1d, %d",
  169.         day[(DateToVal(dte) +1) % 7],
  170.         month[dte.da_mon], dte.da_day,
  171.         dte.da_year); break;
  172.     case 3 : sprintf((char *) dest_date, "%2.2d%2.2d%2.2d",
  173.         dte.da_mon, dte.da_day,
  174.         (dte.da_year - 1900)); break;
  175.     case 4 : sprintf((char *) dest_date, "%2.2d%2.2d%2.2d",
  176.         (dte.da_year - 1900), dte.da_mon,
  177.         dte.da_day); break;
  178.     case 5 : sprintf((char *) dest_date, "%2.2d-%2.2d-%2.2d",
  179.         dte.da_mon, dte.da_day,
  180.         (dte.da_year - 1900)); break;
  181.     case 6 : sprintf((char *) dest_date, "%2.2d/%2.2d/%2.2d",
  182.         dte.da_mon, dte.da_day,
  183.         (dte.da_year - 1900)); break;
  184.     case 7 : sprintf((char *) dest_date, "%1d-%1d-%d",
  185.         dte.da_mon, dte.da_day,
  186.         dte.da_year); break;
  187.     case 8 : sprintf((char *) dest_date, "%1d/%1d/%d",
  188.         dte.da_mon, dte.da_day,
  189.         dte.da_year); break;
  190.     case 9 : *((char *) dest_date) = (DateToVal(dte)+1) % 7;
  191.     default : return(-1);
  192.      }
  193.     return(0);
  194. }
  195. /*
  196. main()
  197. {
  198.   char date1[40] = "";
  199.   unsigned int d1980 = 0;
  200.   unsigned int val = 6036;
  201.  
  202.   ConvertDate(&d1980, "01/01/80", 0, 6);
  203.  
  204.   ConvertDate(&val, "12/20/91", 0, 6);
  205.  
  206.   printf("%s\n", date1);
  207.   getch();
  208.  
  209.  
  210. }
  211.  */